{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 11.7. Creating a sound synthesizer in the Notebook"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython.display import (\n",
    "    Audio, display, clear_output)\n",
    "from ipywidgets import widgets\n",
    "from functools import partial\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "rate = 16000.\n",
    "duration = .25\n",
    "t = np.linspace(\n",
    "    0., duration, int(rate * duration))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def synth(f):\n",
    "    x = np.sin(f * 2. * np.pi * t)\n",
    "    display(Audio(x, rate=rate, autoplay=True))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "podoc": {
     "output_text": "Sound widget"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n+KHdbqJPP/2UT29QWFho24so1LUB4Ht8e8hnrRO0hwSnVCpLS0szMzPtPsuybEdHh+VQZPI/K+Ss\nWrXKJxUE3wlTMaWZTIKvRpzGhDOlaySRGnyWrXHZosvLyx2kEVKr1WVlZc8995zIYhtCiPQXv/iF\nsCVaLqzhe8eOHfPk5REREcXFxbt37+ZGowlVK0HI5XKZTMYNYaKU3r59OyoqKj4+nr/11dDQ8Ic/\n/GFiYoL7s7Ky0rYzgVL6zjvvHDlypLq6uq6ubuvWrVbxW1RUVEdHBzfAaWZm5u7duykpKTrdv9Ya\nm5+fv3Tp0qFDh/jQ6Ec/+pHdGeoJCQl8twY3uCslJYUPPPr6+j744IOHDx9yf6alpb3wwgtun5np\n6emDBw9yF94PfvADoUaOCnIqxsfH33zzzdOnT3O5GtevX2+1Q2pq6tWrV7nU0n19fd3d3StXruRj\nFb1ef+TIkXPnznF/hoSEvPLKK7ZfQ4JcGwD+opAxKgV50E8nZhbf2XOxEcwzedL0aIl/chp4h06n\nW+OE6Ojo8fFxo9HoUuF79uyxfZD/tZXL5Vu2bNm9ezc/CdDKzMzMJ598YpX4hGGYtLQ0LpWtS5WB\nAMcwJCyEmTTQlkE67+X2oFJGStdIy7OkIVg8yR65XJ6YmMgwTE9Pj+26ESqVqqysbOfOnYE538bD\nbwYkhv4XqVSalZVVWlq6evXqgM1TWV5eXlNT09TURAjR6/V//OMfP/roo4SEBIlE0t/fb5mUJikp\n6cknn7Qtoa2tjZ/u0t7eXlNTk5+fb7XPvn372trauIFSvb29b731VkxMTHR09NzcXHd3t+WKUdu2\nbbNtr3NSUlKqqqqOHz9OCKGUfvHFF6dOnUpOTlapVKOjo5a38VQq1csvv+zeCeFcv36dG9KdmJiY\nkpLiSVFWPD8V165d49+Xc+fOfec739FqtZY7KJXKl19++d133+XCs9u3b9+5cycpKSkiImJ6erqj\no8Oyk23//v1WL+d5fm0A+IuEIRkxktI19JOvzbPW69oLTCkj+WmStQkSqYjGLqSnpzs58W9yclKn\n0507d86TlTEsKZXKTZs2VVZWOphCU1tb++jRI6sHZTLZ+vXrsaanKGmUpHwt0zYkud3Gsl7L38Ew\nZFWspHK9JEwMS7h5y0LZosWUA9ou9N4QQkh0dPTu3bsrKioyMjICuYdOIpHk5ua2trby6ciMRuPw\n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\nLzgAAAAASUVORK5CYII=\n",
      "text/plain": [
       "Sound widget"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "synth(440)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "notes = 'C,C#,D,D#,E,F,F#,G,G#,A,A#,B,C'.split(',')\n",
    "freqs = 440. * 2**(np.arange(3, 3 + len(notes)) / 12.)\n",
    "notes = list(zip(notes, freqs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "podoc": {
     "output_text": "Synthesizer in the notebook"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABiAAAAGcCAIAAADf0v9aAAAAA3NCSVQICAjb4U/gAAAAGXRFWHRT\nb2Z0d2FyZQBnbm9tZS1zY3JlZW5zaG907wO/PgAAIABJREFUeJzs3XlAFPXj//FZbuQURUUFESMl\n8b5vo8PEO0utPmXpx/pYH+vzScvP5/sp65P1KcuyMlPLSi3NxDO88MYzj7xNAQUREQU5F1iu3fn9\nMd/ffOa7C8uyA8vCPh9/zezOzr59O8zOvOZ9aERRFAAAAAAAAABrOdV3AQAAAAAAANCwETABAAAA\nAABAFQImAAAAAAAAqELABAAAAAAAAFUImAAAAAAAAKAKARMAAAAAAABUIWACAAAAAACAKgRMAAAA\nAAAAUIWACQAAAAAAAKoQMAEAAAAAAEAVAiYAAAAAAACoQsAEAAAAAAAAVQiYAAAAAAAAoAoBEwAA\nAAAAAFQhYAIAAAAAAIAqBEwAAAAAAABQhYAJAAAAAAAAqhAwAQAAAAAAQBUX829rNBrblKPxEUXR\nwi2pZKtRyTZAJdsAlWwDVLINUMk2QCXbAJVsA1SyDVDJNkAl2wCVbAOWV3K1aMEEAAAAAAAAVQiY\nAAAAAAAAoEo1XeRkOTk5dVqORiMgIMDqz1LJFqKSbYBKtgEq2QaoZBugkm2ASrYBKtkGqGQboJJt\ngEq2ASrZBtRUclVowQQAAAAAAABVCJgAAAAAAACgCgETAAAAAAAAVCFgAgAAAAAAgCoETAAAAAAA\nAFCFgAkAAAAAAACqEDABAAAAAABAFQImAAAAAAAAqELABAAAAAAAAFUImAAAAAAAAKAKARMAAAAA\nAABUIWACAAAAAACAKgRMAAAAAAAAUIWACQAAAAAAAKoQMAEAAAAAAEAVAiYAAAAAAACoQsAEAAAA\nAAAAVQiYAAAAAAAAoAoBEwAAAAAAAFQhYAIAAAAAAIAqBEwAAAAAAABQhYAJAAAAAAAAqhAwAQAA\nAAAAQBUCJgAAAAAAAKhCwAQAAAAAAABVCJgAAAAAAACgCgETAAAAAAAAVCFgAgAAAAAAgCoETAAA\nAAAAAFCFgAkAAAAAAACqEDABAAAAAABAFQImAAAAAAAAqELABAAAAAAAAFUImAAAAAAAAKAKARMA\nAAAAAABUIWACAAAAAACAKgRMAAAAAAAAUIWACQAAAAAAAKoQMAEAAAAAAEAVAiYAAAAAAACoQsAE\n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\n4+MdNhK1nLL50vPPP7948WJpecOGDXPnzrVun/Ih2r59e9NROLOzs+/evSstc/3m7OwsDVZlymAw\naLXa27dvnz17ds2aNbdv35Ze1+l0//73v1euXGm7UjZMZBcy++0i98EHHyj/h7p27bpx48bJkydX\n9UDSzc3t6aef/u677wICAuQX16xZc/r06Tovq/3ZunWrPF2CIAjNmzf//vvv58yZY2ZUmsGDB//0\n00+RkZHyKxcuXPj++++r/S75tB4UFKSsfElhYaH8pILnBpXSaDS+vr7h4eHR0dEff/zxunXrlM9w\npIeQcut0mPLy8goJCRk+fPjcuXO3bdv24IMPKt/98MMPr127Zsl+OJIBmFftYDTyaSQkJMTHx8d2\nJbMnq1atkqbjlHh5eX355Zdffvml+TNn3759165dq2xzWlxc/Mknn9RhQe3SuXPnPv30U3lVo9G8\n/PLL69evj4qKMjP7R7t27RYuXLhgwQJlA8ZPPvlEvm8x4+rVq+aHF6TXp9Lp06flZ7E9e/ZUXnKo\n7OflCAoLC+WTQ7t27SZMmCAf1du3b7fkcK2UfMNoPiEVOIbNcnJy8vPzi4iIePrppzdv3qycMeD8\n+fMnTpyox7I1CGQXMjsNmE6ePCk/HxAEoUuXLsuXL7dkyN5OnTp99NFHyt9g0zbGjV5ubq7y2Ze/\nv/93333XpUuXaj/o5+f3+eefK6cKXr169b1798x/yvyVx9WrV+X2OHTdt0R4ePgPP/yg/I1MTU2V\n5iRCtfz9/T/77LMJEybIr5SWln700UeWfJYjGYB5169flwfEMX8r7rBnifT0dOX0qX5+ft9///2Q\nIUMs+axGo5kzZ86TTz4pv3L48GHlzWGjV1FR8f7778vDcGg0mvfee2/GjBkWdkl+9NFH58+fL69m\nZ2dv3Lix2k/JNezv7286mm9ZWZn8kIabc0EQtmzZIi/37Nlz0KBBXl5e0urJkyermqkZkj179siT\nJPTo0aNp06Zya2itVhsXF2fdbs33gJPv+QMDA5X3ODDDzc1twYIFymTE6v8dB0F2oWSnAZNykmAf\nH59PP/3U8pEU+vTp8/jjj8urly9fbgRBYI188803+fn58ur8+fNN5wSpSrNmzWbPni2v6nS6DRs2\nmP+I+dty+aTv4+PjgA3drePj4/PFF1/4+/vLr/z0009Mv2W5t956SzmHzu+//27JvO8cyQDMk88D\n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\nPkt4e3u3a9fO6N3y8nJ5GgGHvRVXnhMsuX7TarUWTu5pm/5i9aumtafX6y2sPTOtD+SjutJOnVev\nXpVTFYc9qiXySOdC1Q1wBEHo379/YGBgVlaWtLphwwYCJuH/9i4cMmSIn59fpZv5+voOHz48Li5O\nWt28efP06dNNuyIqJScny8ksub/lqmrMVV5ertPpsrOzlXl3WVnZmjVrfvvttyVLlnANXCmyC1N2\nFzApb6HNt1eHKaMAoqioyN/fv46+Kz09XR7v0HzXfVqlqqFsNl/XfR4bH0tqjyPZCgsXLuzTp099\nl6Lxi46O/p//+R/LtyeDVgoKCoqJibF8e/P92pSD0ZhG1deuXZMvKx32TkZ5+NWoayeE/1t7FRUV\nOp3OBom8+V83+V0fHx9HHrb29OnT8khVZhrgCILg7Ow8ZsyY77//Xlrdt29fTk5OQECALUppr4qL\ni/fs2SOvmg7vrTR27Fg5YLpz586hQ4cefPBBM9vLh6ibm5vpuE6iKF65ckVa5vpN5uzsvGbNGvPb\n3L59++jRoytXrrx9+7b0yvXr11955ZU1a9aYDnQFsgtTdhcwKacdycrK0uv15tNrKBlN2pKRkdGm\nTZs6+i75rO3k5FTpsy/5yZjDXm3XCuXA3rTvrSn5QaJQ9ZggHMmwW87OzmRGatRi7Zlv5ygPHeLu\n7m56n+MgWrRoIS/L49bBQkbDzdy6dauqfli1JTc3V55ctdJfN2X8VFX7X0egbIDj7+9v/ub87t27\n8nJZWdnWrVtfeOGFOiyc3duzZ4/ceVaj0Zw/f14+W5oyGAxOTk4Gg0Fa3bBhg/mASb5+Cw8PN+1Y\neuPGDa1WKy1z/VYjrVu3fvLJJ8eNG/fmm2/Gx8dLL16/fv277757+eWX67dsdojswpTdBUzKhyQV\nFRW3bt0ybYuOqhjVVWpqau/evWtr5waDYefOnfLqgQMHpAU/Pz/57CMrLi6Wk5H8/Pzt27cr3w0P\nD7///vtrq2CNWF5enty4RjD5/0W1lEP8yrXHkQygWlevXpVnjjcYDPIYIkVFRUbnAUEQ9u/fLy0E\nBATIT+Blo0aNqsuS2ouwsDB5OS8vr9q2GwMGDJDrzdTChQt37NhRm+Wzbx06dFCupqSkmA+YvLy8\nzNTe3r17//Of/5i+fuzYMfmiQvn7ePPmTdOj+ty5c9KCs7Oz0bvNmjXr37+/meI1Glqtdu/evfJq\n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\nxatXr0rLlQ6cLL8bHBysHPITlrh58+a0adOUV+SdOnVq6Em2zRQUFMybN2/58uXyK56ennI/FyMc\nyQCqJT8J9/f3b9OmjdG7paWlKSkp0jIzCQiCEB4ernwuVVJS8uqrr65YscLCkXoLCwuXLVs2ZcoU\neWJsh+Lp6fnOO+8or1qXLFnyz3/+Mycnx5KPGwyG7du3T5w4UR7LqSry7bf51h+CAx/VygY4ERER\nHTp0qNHHx4wZo2zPaBqRNG7btm2T765dXV2rnRLRSPfu3du3by+vbt++Xdm4QxCEa9euSWPFCtUd\nww57AKtXVlY2b9485ajejz76qKura/2VyK6RXSjZacAkCMLbb7/dvHlzefXw4cNS337lf4BSQUHB\n4sWLZ86cqRx+bMKECXInc4fy9NNP9+vXT15NTU195plnli9fXlhYWOn2FRUVW7dunTJlivI8Eh4e\n/re//c104xs3bsj7Mf/cgEYfFqqoqEhLS4uLi5s9e/aECROUbdf9/f0//vhjJyf7/VOtd6IoZmZm\nHj169KOPPho5cmRsbKz8lkajmT9/fqtWrSr9IEcygGqZ74iRkJAgz1bJiULy0ksvPfbYY/JqRUXF\nkiVLJk6cuHbtWnmAIVNJSUmLFi2Kjo5evny5cmJ4jUbTpUuXui2xPenbt++bb76pfGXXrl3jx4//\n4osvbt68WdWnsrKyfvrpp/Hjx7/11luZmZnKtyptcWD+9lv+7WvevHlVP6CNW1ZW1rFjx+TVUaNG\n1XQPLVq0GDhwoLx66tQpOYl2BMrRZKTBYWu6h/Hjx8vLRUVFyu6KguK07OnpGRYWZvRZvV6fkJAg\nLXNatkJaWtovv/wyadIkaSA2ibe395///Od6LJX9I7uQ2W88FhAQ8NVXX82YMUOr1Uqv3Llz5+23\n3/7yyy8feuihrl27BgUFeXh4aLXa9PT006dPHzhwwGhk+379+hn9SDsOjUbzySefvPjii3ITjJKS\nkmXLlq1atWr48OE9e/YMDQ319vbW6XT37t07e/bs/v37jbrRBQUFffrpp5UOyCdfeVTVsZmu+6Zy\nc3NHjBhh+rrBYCgtLS0sLBRF0fRdHx+fzz77TDn5pcOaMWOG6eAmoihWVFRotVr5Bk/Jyclpzpw5\nZk7THMlWmzt3rtVPsaZPnz5p0qTaLQ9Qdyxs6+Hl5RUaGmqzUtkzjUbz3nvvubu7K9uA3Lp165NP\nPvnss88iIyM7derUpk0bb2/vioqKvLy8GzdunD9/Pj093XRXgYGB77zzzqBBg2xY/Pr35JNPOjk5\nffTRR/JPm1arXbly5cqVK8PCwiIjI0NDQ318fJycnLRabVpa2qVLl5KSkkzvYdzd3WfOnPncc88Z\nvX7nzp179+5Jy/T6rNS2bdvkYRydnZ2Vganlxo0bd/jwYXl1w4YNb7zxRu2Uz75duHBBOcO6FfGc\n9KnFixfLfwIxMTHyoN2C4hDt2LGj6cVhSkqKTqeTlmnBZESv11d6PyK/W1hYKLcOU5o9e7bRjHIw\nQnYhs9+ASRCEjh07fvPNN3PmzFFedmRlZa1bt27dunXmP/vggw9+9NFHjjxsjY+Pz9KlS//xj3+c\nOHFCflGn0+3cudPoOYCp0NDQJUuWKAcCUJJP6x06dDBNoG7fvi0PbMZtucxgMBg9VKxWhw4dFi5c\nyB2LRDkUgiV8fHzmz58/bNgwM9twJFutpoMXKhk1dAfsWUFBQVpamrRc7a245WMAN3qurq7vvvtu\nRETE4sWLlX/yer3+/Pnz58+fr3YPzs7OEydO/Otf/+rj41OXJbVTEydODAkJmT9/vnz4SZKTky0Z\n8UAQhH79+v3zn/9s166d6VvyQavRaMyPP+iwv33KbLR///7NmjWzYidDhw4NCAiQuzfGxsb+9a9/\n9fT0rJ0i2rEtW7bIyz4+PkOHDrViJ9LkNvLYVYmJiefPn5eb48mHqPkmeG5ubvfdd58V39641fR+\nxNnZefbs2co2ZagK2YXE3vvddOrUae3atRMmTLB8ZhYfH5933nnns88+axz/Q2r4+/t//fXXr732\nmuXXZ87Ozs8+++zPP/9cVbokWPw418nJqaqRlWFeSEjIv/71r3Xr1pEuWcHf3/+FF17Ytm2b+XRJ\n4EgGUJ1qR/qnnaMZkydP3rRp07hx4yycnlzi6uoaHR29YcOGf/7zn46ZLkn69OkTExMzc+bMpk2b\n1uiDvXr1Wrp06bJlyypNlwTFUV3p8IL5+fm3b9+Wlh2z9ceZM2eUQ4BZ1wBHEARXV1flZ7VabVxc\nnNrC2T2dTqccY/6RRx6x+nbMKNGIiYmRFkpKSuSY1fxpOTw8nJtBNTQaTb9+/dasWfPUU0/Vd1ka\nDLILwc5bMEl8fX3nzZv33HPPbdq0ae/evRkZGVVt2b59+8cff3zcuHGOfEVixMnJ6fnnn3/88cc3\nbdq0Z88e5bWykWbNmkVHR0+ePNl0EFMlvV4vd7sz/zi3Xbt23t7eKsruEDQaTZMmTZo0adK0adMO\nHTqEh4cPHDiQGVUt5+Hh4eXl5ePj065du/Dw8N69e/fq1cuSsfE4kgFUSz4PBAYGtmzZ0ujdau9z\n0KJFi3fffXfWrFm//vprfHz8xYsXqxqNwsXFpXPnzlFRUdHR0cphLByZu7v7iy++OHXq1F27du3b\nt+/UqVPK0amMhIaGDh8+PDo6Ojw83PxuzT9cYfpUZfOlJk2aKAfuranx48crJ4fasGFDo28GsmfP\nHmWjRTWTYQ0aNCgwMFCeemjv3r1z5szx9/evduQ7cn/ruLi4eHp6enp6BgYGdujQoVOnTg8++KBj\njsKmEtmFptKRX/779v9v723hBBY2cPv27aSkpLS0tMLCQp1O5+7u7uvrGxQU1K1bN3u4IpFnezVf\nsUq2rOS8vLzExMSUlJSCgoLi4mInJydfX99mzZpJXfot2UN+fv4333wjLU+ZMsV0eKCtW7cmJiYK\nghAeHl5Hv6N2XsmNQ6OvZI5kB0El20AjruSdO3deunRJEISQkJDJkycbvZuVlbVy5UppeerUqS1a\ntKi7kjSOStZqtdeuXUtOTs7NzS0qKhJF0dPTs2XLlsHBwREREU2aNKnf4tl5JZeVlSUnJ1+7di0r\nK6uwsLC8vNzDwyMgIECqPbnw1Vq+fLk0t9GgQYOUA1FLzpw5s2/fPkEQPDw8Zs2aVbv/BMHuK7lx\naNyVfOnSJWmsDycnp9dff920b/JXX30ljcEUFRXVq1evOipG465kO9E4KrnxZRfVangBk51rHH8J\ndo5KtgEq2QaoZBugkm2ASrYBKtkGqGQboJJtgEq2ASrZBqhkG6iLgMnex2ACAAAAAACAnSNgAgAA\nAAAAgCoETAAAAAAAAFCFgAkAAAAAAACqEDABAAAAAABAFQImAAAAAAAAqELABAAAAAAAAFUImAAA\nAAAAAKAKARMAAAAAAABUIWACAAAAAACAKgRMAAAAAAAAUIWACQAAAAAAAKoQMAEAAAAAAEAVAiYA\nAAAAAACoQsAEAAAAAAAAVQiYAAAAAAAAoAoBEwAAAAAAAFQhYAIAAAAAAIAqBEwAAAAAAABQhYAJ\nAAAAAAAAqhAwAQAAAAAAQBUCJgAAAAAAAKhCwAQAAAAAAABVCJgAAAAAAACgCgETAAAAAAAAVCFg\nAgAAAAAAgCoETAAAAAAAAFCFgAkAAAAAAACqEDABAAAAAABAFQImAAAAAAAAqELABAAAAAAAAFUI\nmAAAAAAAAKAKARMAAAAAAABUIWACAAAAAACAKgRMAAAAAAAAUIWACQAAAAAAAKoQMAEAAAAAAEAV\nAiYAAAAAAACoQsAEAAAAAAAAVQiYAAAAAAAAoAoBEwAAAAAAAFQhYAIAAAAAAIAqBEwAAAAAAABQ\nhYAJAAAAAAAAqhAwAQAAAAAAQBUCJgAAAAAAAKhCwAQAAAAAAABVCJgAAAAAAACgCgETAAAAAAAA\nVCFgAgAAAAAAgCoETAAAAAAAAFCFgAkAAAAAAACqEDABAAAAAABAFQImAAAAAAAAqELABAAAAAAA\nAFUImAAAAAAAAKAKARMAAAAAAABUIWACAAAAAACAKgRMAAAAAAAAUIWACQAAAAAAAKoQMAEAAAAA\nAEAVAiYAAAAAAACoQsAEAAAAAAAAVQiYAAAAAAAAoAoBEwAAAAAAAFQhYAIAAAAAAIAqBEwAAAAA\nAABQhYAJAAAAAAAAqhAwAQAAAAAAQBUCJgAAAAAAAKhCwAQAAAAAAABVCJgAAAAAAACgCgETAAAA\nAAAAVCFgAgAAAAAAgCoETAAAAAAAAFCFgAkAAAAAAACqEDABAAAAAABAFQImAAAAAAAAqELABAAA\nAAAAAFUImAAAAAAAAKAKARMAAAAAAABUIWACAAAAAACAKgRMAAAAAAAAUIWACQAAAAAAAKoQMAEA\nAAAAAEAVjSiK5t7WaGxWlEbGfMUqUclWo5JtgEq2ASrZBqhkG6CSbYBKtgEq2QaoZBugkm2ASrYB\nKtkGLK/katGCCQAAAAAAAKoQMAEAAAAAAECVarrIAQAAAAAAAObRggkAAAAAAACqEDABAAAAAABA\nFQImAAAAAAAAqELABAAAAAAAAFUImAAAAAAAAKAKARMAAAAAAABUIWACAAAAAACAKgRMAAAAAAAA\nUIWACQAAAAAAAKoQMAEAAAAAAEAVAiYAAAAAAACoQsAEAAAAAAAAVQiYAAAAAAAAoAoBEwAAAAAA\nAFQhYAIAAAAAAIAqBEwAAAAAAABQhYAJAAAAAAAAqhAwAQAAAAAAQBUCJgAAAAAAAKhCwAQAAAAA\nAABVCJgAAAAAAACgCgETAAAAAAAAVCFgAgAAAAAAgCoETAAAAAAAAFCFgAkAAAAAAACqEDABAAAA\n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\nTkSuQmCC\n",
      "text/plain": [
       "Synthesizer in the notebook"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "layout = widgets.Layout(\n",
    "    width='30px', height='60px',\n",
    "    border='1px solid black')\n",
    "\n",
    "buttons = []\n",
    "for note, f in notes:\n",
    "    button = widgets.Button(\n",
    "        description=note, layout=layout)\n",
    "\n",
    "    def on_button_clicked(f, b):\n",
    "        # When a button is clicked, we play the sound\n",
    "        # in a dedicated Output widget.\n",
    "        with widgets.Output():\n",
    "            synth(f)\n",
    "\n",
    "    button.on_click(partial(on_button_clicked, f))\n",
    "    buttons.append(button)\n",
    "\n",
    "# We place all buttons horizontally.\n",
    "widgets.Box(children=buttons)"
   ]
  }
 ],
 "metadata": {},
 "nbformat": 4,
 "nbformat_minor": 2
}
